package com.kexio.enterprise.integration.event;

import com.kexio.enterprise.integration.event.condition.EventCondition;
import com.kexio.enterprise.integration.event.domain.Event;
import com.kexio.enterprise.integration.event.filter.EventFilter;
import com.kexio.enterprise.integration.event.handler.EventHandler;
import com.kexio.enterprise.integration.event.history.EventHistory;
import com.kexio.enterprise.integration.event.listener.EventListener;
import com.kexio.enterprise.integration.event.query.EventQueryCriteria;
import com.kexio.enterprise.integration.event.result.EventHandleResult;
import com.kexio.enterprise.integration.event.result.EventPublishResult;
import com.kexio.enterprise.integration.event.result.EventReplayResult;
import com.kexio.enterprise.integration.event.schedule.EventScheduleResult;
import com.kexio.enterprise.integration.event.statistics.EventStatistics;
import com.kexio.enterprise.integration.event.status.EventProcessingStatus;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * 事件服务接口
 * 
 * 提供应用内事件的发布、订阅和处理功能
 * 
 * @author Kexio
 * @since 1.0.0
 */
public interface EventService {

    /**
     * 发布事件（同步）
     * 
     * @param event 事件对象
     * @return 发布结果
     */
    EventPublishResult publishEvent(Event event);

    /**
     * 发布事件（异步）
     * 
     * @param event 事件对象
     * @return 异步发布结果
     */
    CompletableFuture<EventPublishResult> publishEventAsync(Event event);

    /**
     * 批量发布事件
     * 
     * @param events 事件列表
     * @return 发布结果列表
     */
    List<EventPublishResult> batchPublishEvents(List<Event> events);

    /**
     * 发布到特定主题
     * 
     * @param topic 主题
     * @param event 事件对象
     * @return 发布结果
     */
    EventPublishResult publishToTopic(String topic, Event event);

    /**
     * 发布条件事件
     * 
     * @param event     事件对象
     * @param condition 发布条件
     * @return 发布结果
     */
    EventPublishResult publishConditionalEvent(Event event, EventCondition condition);

    /**
     * 延迟发布事件
     * 
     * @param event     事件对象
     * @param delayTime 延迟时间（毫秒）
     * @return 发布结果
     */
    EventPublishResult publishDelayedEvent(Event event, long delayTime);

    /**
     * 定时发布事件
     * 
     * @param event        事件对象
     * @param scheduleTime 定时时间
     * @return 调度结果
     */
    EventScheduleResult scheduleEvent(Event event, LocalDateTime scheduleTime);

    /**
     * 取消定时事件
     * 
     * @param scheduleId 调度ID
     * @return 是否成功
     */
    boolean cancelScheduledEvent(String scheduleId);

    /**
     * 订阅事件类型
     * 
     * @param eventType 事件类型
     * @param listener  事件监听器
     */
    void subscribeEventType(String eventType, EventListener listener);

    /**
     * 订阅主题
     * 
     * @param topic    主题
     * @param listener 事件监听器
     */
    void subscribeTopic(String topic, EventListener listener);

    /**
     * 取消订阅事件类型
     * 
     * @param eventType 事件类型
     * @param listener  事件监听器
     */
    void unsubscribeEventType(String eventType, EventListener listener);

    /**
     * 取消订阅主题
     * 
     * @param topic    主题
     * @param listener 事件监听器
     */
    void unsubscribeTopic(String topic, EventListener listener);

    /**
     * 查询事件历史
     * 
     * @param criteria 查询条件
     * @return 事件列表
     */
    List<Event> queryEvents(EventQueryCriteria criteria);

    /**
     * 重放事件
     * 
     * @param eventId 事件ID
     * @return 重放结果
     */
    EventPublishResult replayEvent(String eventId);

    /**
     * 批量重放事件
     * 
     * @param eventIds 事件ID列表
     * @return 重放结果列表
     */
    List<EventPublishResult> batchReplayEvents(List<String> eventIds);

    /**
     * 获取事件统计信息
     * 
     * @param eventType 事件类型
     * @return 统计信息
     */
    EventStatistics getEventStatistics(String eventType);

    /**
     * 获取所有事件统计信息
     * 
     * @return 统计信息映射
     */
    Map<String, EventStatistics> getAllEventStatistics();

    /**
     * 清空事件统计信息
     * 
     * @param eventType 事件类型
     */
    void clearEventStatistics(String eventType);

    /**
     * 获取活跃监听器数量
     * 
     * @param eventType 事件类型
     * @return 监听器数量
     */
    int getActiveListenerCount(String eventType);

    /**
     * 检查事件类型是否有监听器
     * 
     * @param eventType 事件类型
     * @return 是否有监听器
     */
    boolean hasListener(String eventType);

    /**
     * 订阅事件（带过滤器）
     * 
     * @param eventType 事件类型
     * @param filter    事件过滤器
     * @param listener  事件监听器
     */
    void subscribeWithFilter(String eventType, EventFilter filter, EventListener listener);

    /**
     * 注册事件处理器
     * 
     * @param eventType 事件类型
     * @param handler   事件处理器
     */
    void registerEventHandler(String eventType, EventHandler handler);

    /**
     * 注销事件处理器
     * 
     * @param eventType 事件类型
     * @param handler   事件处理器
     */
    void unregisterEventHandler(String eventType, EventHandler handler);

    /**
     * 批量重放事件
     * 
     * @param eventIds 事件ID列表
     * @return 重放结果列表
     */
    List<EventReplayResult> batchReplayEventsWithDetail(List<String> eventIds);

    /**
     * 查询事件历史
     * 
     * @param criteria 查询条件
     * @return 事件历史列表
     */
    List<EventHistory> queryEventHistory(EventQueryCriteria criteria);

    /**
     * 获取事件处理状态
     * 
     * @param eventId 事件ID
     * @return 处理状态
     */
    EventProcessingStatus getEventProcessingStatus(String eventId);

    /**
     * 设置事件处理是否启用
     * 
     * @param enabled 是否启用
     */
    void setEventProcessingEnabled(boolean enabled);

    /**
     * 清理事件历史
     * 
     * @param beforeTime 清理此时间之前的历史
     * @return 清理的记录数
     */
    int cleanupEventHistory(LocalDateTime beforeTime);

    /**
     * 获取事件处理结果
     * 
     * @param eventId 事件ID
     * @return 处理结果列表
     */
    List<EventHandleResult> getEventHandleResults(String eventId);
}
